package S_Algorithm;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author DannyYo
 */

import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;

/**
 * 用随机数生成函数产生“磁道号”序列（即磁盘请求的位置），共产生100个。其中50%位于0～499，25%分布在500～999，25%分布在1000～1499。
 * @author Administrator
 */
public class DiskScheduleUtil {

    public static int count = 0;// 需要生成随机数的个数

    public int[] createDiskRequest() {
        int[] tmpRequest = new int[101];
        HashSet<Integer> s = new HashSet<Integer>();
        // 50%位于0～499的序列
        count = 50;
        genRadoms(0, 499, count, s);
        Iterator<Integer> it;
        it = s.iterator();
        int i = 0;
        while (it.hasNext()) {
            tmpRequest[i] = it.next();
            i++;
        }
        // 25%分布在500～999的序列
        count = 25;
        s.clear();
        genRadoms(500, 999, count, s);
        it = s.iterator();
        i = 50;
        while (it.hasNext()) {
            tmpRequest[i] = it.next();
            i++;
        }
        //25%分布在1000～1499的序列
        count = 25;
        s.clear();
        genRadoms(1000, 1499, count, s);
        it = s.iterator();
        i = 75;
        while (it.hasNext()) {
            tmpRequest[i] = it.next();
            i++;
        }
        //用来打乱tmpRequest的顺序
        int[] tmpRequestReturn = new int[101];
        int[] nosortSeq = random2();
        for(int j = 0; j  < 100; j++){
            tmpRequestReturn[j] = tmpRequest[nosortSeq[j]];
            System.out.print("[" + j + "]:" + tmpRequestReturn[j] + " ");
            if (j % 10 == 0) {
                System.out.println();
            }
        }
        for(int z=100;z>=1;z--)
        {
            tmpRequestReturn[z] = tmpRequestReturn[z-1];
        }
        return tmpRequestReturn;
    }

    // 生成【begin，end】区间内num个随机数
    public void genRadoms(int begin, int end, int num, HashSet<Integer> set) {
        if (num > (end - begin + 1) || end < begin) {
            return;
        }
        for (int i = 0; i < num; i++) {// 生成num个随机数
            // 调用Math.random()方法
            int temp = (int) (Math.random() * (end - begin + 1)) + begin;
            set.add(temp);// 将不同的数存入HashSet中
        }
        int setLen = set.size();
        // 如果存入的数小于指定生成的个数，则调用递归再生成剩余个数的随机数，如此循环，直到达到指定大小
        if (setLen < count) {
            genRadoms(begin, end, count - setLen, set);// 递归
        }
    }


    public static int[] random2() {
        int send[] = new int[100];
        for(int i = 0; i < send.length; i++){
            send[i] = i;
        }
        int temp1, temp2, temp3;
        Random r = new Random();
        for (int i = 0; i < send.length; i++) // 随机交换send.length次
        {
            temp1 = Math.abs(r.nextInt()) % (send.length - 1); // 随机产生一个位置
            temp2 = Math.abs(r.nextInt()) % (send.length - 1); // 随机产生另一个位置
            if (temp1 != temp2) {
                temp3 = send[temp1];
                send[temp1] = send[temp2];
                send[temp2] = temp3;
            }
        }
        return send;
    }

}
